草庐IT

CountDownLatch和ExecutorService 线程池cachedThreadPool.submit

全部标签

c++ - 多线程应用程序中的显示任务必须使用原子锁或互斥锁吗?

我正在使用C++11和内置线程类std::thread。使用std::atomic或std::mutex可以轻松同步数据,但我想知道“非敏感”任务是否真的有必要-同时保持一个没有错误的应用程序。假设有一个类classFPS{private:intrate;public:voidchange(constinti){rate=i;}intread(void){returnrate;}};存储相机的帧率。在应用程序中,有一个线程用于读取帧速率的数据采集(帧抓取等),还有另一个线程处理显示帧速率的GUI。在这种情况下,显示是“非关键”的,这意味着在某些情况下允许显示滞后于实际速率。我当然可以简

c++ - 导致 C++11 std::mutex 将阻塞的线程锁定为被动等待状态?

我有以下情况:两个C++11线程正在计算,它们通过std::mutex同步。线程A锁定互斥锁,直到数据准备好供线程B执行的操作使用。当互斥量解锁时,线程B开始工作。线程B试图锁定互斥量并被阻塞,直到它被线程A解锁。voidThreadA(std::mutex*mtx,char*data){mtx->lock();//dosomethingusefulwithdatamtx->unlock();}voidThreadB(std::mutex*mtx,char*data){mtx->lock();//waituntilThreadAisready//dosomethingusefulwit

c++ - 互斥体能否在不显式保护对象的情况下确保对象的线程可见性?

考虑以下代码,尽管线程都引用相同的指针,但线程是否可能以不同的方式查看对象的状态?usingnamespacestd;classProducerAndConsumer{classDummyObject{public:DummyObject(){sprintf(a,"%d",rand());}private:chara[1000];};mutexqueue_mutex_;queuequeue_;thread*t1,*t2;voidProduce(){while(true){Sleep(1);//constructingobjectwithoutanyexplicitsynchroniza

c++ - volatile 在 C++ 的单线程应用程序中有用吗?

如标题所说-volatile在单线程编程的上下文中是否有用?我知道它用于确保变量的值始终在内存中实际检查,所以在任何情况下该值可能会以应用程序/编译器不会注意到的方式更改(在ST应用程序中)?我让这个问题与语言无关,因为我不知道它们之间的任何差异会影响对这个问题的回答。但如果有的话请告诉我。编辑:正如有人向我指出的那样,这个问题与语言无关。然后我将其设为特定于C++(我读到C++版本也存在差异,但我希望它们不会大到足以使这个问题过于宽泛)。 最佳答案 这是C和C++的答案是的!当变量映射到硬件寄存器(例如I/O设备)时。硬件独立于应

c++ - 我是否需要保护一个由一个线程写入并由多个线程读取的变量?

我正在编写一个数据采集系统。该系统既处理来self们的信号数字化仪的快速数据,又慢速控制/监控探测器的高压系统等。慢速控制系统每秒读取一次电压并将其写入数据结构。每个事件在写入磁盘之前都标有其检测器的电压。为此,事件处理线程读取由慢速控制/监视线程编写的结构。鉴于在电压读取后X微秒发生的事件是否被标记为前一秒的电压读取并不重要:我是否需要使用互斥锁来保护数据结构或原子变量结构? 最佳答案 如果我理解正确,每一秒都有一个线程读取电压,将其写入某个“数据结构”,其他线程时不时地从该数据结构中读取(我是否正确?)如果此“数据结构”具有原子

c++ - 通过多线程程序 (C++) 打印 {0, 1, 2, 3} 的排列

我想打印一个由用C++11编写的多线程程序设置的{0,1,2,3}的排列。源码是这样的:#include#include#include#include#includeusingnamespacestd;voidfunc(intindex);intmain(){vectorthreads;for(inti=0;i我希望输出0123的排列,但我收到奇怪的结果,如下所示:022301330124我不明白这种奇怪的行为,尤其是我无法解释数字4的存在。这可能是初学者的错误,我还是感谢大家帮助我。 最佳答案 您正在通过引用捕获i:autova

C++11 函数局部静态常量对象的线程安全初始化

此问题已在C++98上下文中提出,并在该上下文中得到回答,但没有明确说明C++11constsome_type&create_const_thingy(){lockmy_lock(some_mutex);staticconstsome_typethe_const_thingy;returnthe_const_thingy;}voiduse_const_thingy(){staticconstsome_type&the_const_thingy=create_const_thingy();//usethe_const_thingy}这个初始化模式会确保:没有出现竞争条件create_co

c++ - 如何用数据创建一个boost线程?

我在使用boost::bind和创建线程时遇到了一些问题。本质上,我想在“扫描仪”对象上调用“扫描”函数,使用绑定(bind)。像这样:Scannerscanner;intid_to_scan=1;boost::threadthr1(boost::bind(&scanner::scan));但是,我在语法上被绊倒了。如何将数据传递给扫描?作为构造函数的一部分? 最佳答案 请记住,任何成员函数的第一个参数都是对象。所以如果你想调用:scanner*s;s->scan()对于bind你会使用:boost::bind(&scanner::

c++ - 关于STL线程安全和STL调试的问题

我有两个关于STL的问题1)为什么STL不是线程安全的?有没有线程安全的结构?2)如何使用GDB调试STL?在GDB中,如何打印vector? 最佳答案 容器数据结构几乎总是需要同步(例如mutex)以防止raceconditions.由于C++标准(C++0x之前)不支持线程,因此无法将这些添加到STL。此外,在不需要同步的情况下,同步的成本非常高。只要您手动执行此同步,就可以在多线程应用程序中使用STL容器。或者,您可以创建自己的线程安全容器,这些容器与thisthread-safecircularqueue等STL算法兼容。.

c++ - 如果线程无法关闭,则进行适当的清理 - C++

当我的应用程序准备好关闭它使用CreateThread创建的胎面时,将执行以下算法:_bCloseRequested=TRUE;dwMsThen=::GetTickCount();do{::GetExitCodeThread(m_hThread,&dwExitCode);dwMsNow=::GetTickCount();}while((dwExitCode==STILL_ACTIVE)&&((dwMsNow-dwMsThen)如果线程未能在规定的5秒内关闭,线程句柄应该关闭还是允许保持打开状态?谢谢。 最佳答案 首先,不要像这样等待